// 导入fs模块
const fs = require('fs');
// 导入path模块
const path = require( 'path' );


// const pathname = path.resolve( __dirname ) ;
const pathname = path.resolve( __filename ) ;

// 采用Promise方式取读取文件或读取目录

let a = Promise.resolve( pathname );
console.log( 'a: ' , a );

let b = a.then( pn => {
    // 若 pn 所表示的路径在磁盘上是存在的
    if( fs.existsSync( pn ) ){
        // 则返回一个对象，其中包含 exists 、path 两个属性
        return { exists: true , path: pn } ;
    }
    throw new Error( `文件或目录(${pn})不存在` );
} );
console.log( 'b: ' , b );

let c = b.then( prev => {
    // 判断
    console.log( prev );
    // let path = prev.path ;
    let { path } = prev ;
    let stats = fs.statSync( path );
    let type ;
    if( stats.isDirectory() ){
        type = 'directory' ;
    }
    if( stats.isFile() ){
        type = 'file' ;
    }
    // 使用 展开运算符(...) 将 prev 展开
    // 这里的 type 等同于 type: type ，
    // 冒号之前的 type 表示新对象的属性名，冒号之后的 type 表示前面的变量名
    return { ...prev , type }
    // 等同于
    // return { exists: prev.exists , path: prev.path , type: type }
});
console.log( 'c: ' , c );

let d = c.then( prev => {
    // 如果是目录就读取目录中所有的子项目
    if( prev.type === 'directory' ) {
        let array = fs.readdirSync( prev.path );
        return array ;
    }
    // 若不是目录则直接返回 prev
    return prev ;
});
console.log( 'd: ' , d );

let e = d.then( prev => {
    // 如果是文件就读取文件中的内容
    if( prev.type === 'file' ) {
        let content = fs.readFileSync( prev.path , 'utf8' );
        return content ;
    }
    // 若不是文件则直接返回 prev
    return prev ;
});
console.log( 'e: ' , e );

let f = e.then( prev => {
    // 若prev是数组则遍历数组
    if( Array.isArray( prev ) ) {
        prev.forEach( e => console.log( '\t' , e ) );
        // 处理完毕，返回 null
        return null ;
    }
    return prev ;
});
console.log( 'f: ' , f );

let g = f.then( prev => {
    // 若prev是个字符串则输出字符串
    if( typeof prev === 'string' ) {
        console.log( '- '.repeat(30) );
        console.log( prev );
        console.log( '- '.repeat(30) );
        return null ;
    }
    return prev ;
});
console.log( 'g: ' , g );

let h = g.catch( error => console.log( error ) );
console.log( 'h: ' , h );

let i= h.finally( () => console.log( 'ending') );
console.log( 'i: ' , i );
